home *** CD-ROM | disk | FTP | other *** search
/ .net (Poland) 2000 September / Magazyn_Net_09_2000 (CDA).iso / internet / Winproxy30.exe / w / _SETUP.1 / ProxyLog.c < prev    next >
C/C++ Source or Header  |  1997-12-03  |  7KB  |  311 lines

  1. // This is the proxy log application that will
  2. // recieve messages from the proxy and log them.
  3.  
  4. // What happens is this guy listens on a port at an IP address
  5. // and when the Proxy Server starts up, it connects to this and 
  6. // sends all of its debug messages here
  7.  
  8. #define        PROXYLOG_VERSION    "0.93"
  9.  
  10. #include <windows.h>
  11.  
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. #include <conio.h>
  15.  
  16. #include <io.h>
  17. #include <fcntl.h>
  18. #include <sys/stat.h>
  19.  
  20. int Port=8000;
  21.  
  22. HANDLE StdIn;
  23.  
  24. void GetKey( void )
  25. {
  26.     printf( "\nPress any key to continue" );
  27.     getch();
  28.     printf("\n");
  29. }
  30.  
  31. int Wait( void )
  32. {
  33. INPUT_RECORD Input;
  34. long NumRead=0;
  35.  
  36.         // This makes the app stop using up all system time  - Kevin
  37.     Sleep( 1 );
  38.  
  39.     GetNumberOfConsoleInputEvents( StdIn, &NumRead );
  40.     if( NumRead == 0 )
  41.         return( TRUE );
  42.  
  43.     ReadConsoleInput( StdIn, &Input, 1, &NumRead );
  44.     if( !NumRead )
  45.         return( TRUE );
  46.  
  47.     if( Input.EventType == KEY_EVENT && Input.Event.KeyEvent.bKeyDown )
  48.     {
  49.         if( Input.Event.KeyEvent.uChar.AsciiChar == 'x' 
  50.             || Input.Event.KeyEvent.uChar.AsciiChar == 'X' 
  51.             )
  52.             return( FALSE );
  53.     }
  54.  
  55.     return( TRUE );
  56. }
  57.  
  58. void main( int argc, char **argv, char **argp )
  59. {
  60. WSADATA SocketData;
  61. SOCKET NewSock=INVALID_SOCKET, MySock=INVALID_SOCKET;
  62. fd_set Set;
  63. char *FileName=NULL;
  64. int FileHandle=(-1);
  65.  
  66.     printf("\nWinProxy logging application V"PROXYLOG_VERSION"\n\n" );
  67.  
  68.     StdIn = GetStdHandle( STD_INPUT_HANDLE );
  69.  
  70.     if( argc <= 1 )
  71.     {
  72.         printf("\nNo port number specified, listening for a logging connection on port %d\n\n", Port );
  73.     }
  74.     else
  75.     {
  76.         argc--;
  77.         argv++;
  78.  
  79.         while( argc )
  80.         {
  81.         char *String = *argv;
  82.         int NewPort;
  83.  
  84.             if( *String == '/' )
  85.             {
  86.                 switch( String[1] )
  87.                 {
  88.                 case 'P':
  89.                 case 'p':
  90.                     NewPort = atoi( &String[3] );
  91.                     if( Port <= 1024 || Port >= 32000 )
  92.                     {
  93.                         printf( "\nThe port number must be between 1024 and 32000\n\
  94. Using port %d instead.\n\n", Port );
  95.                     }
  96.                     else
  97.                         Port = NewPort;
  98.  
  99.                     break;
  100.  
  101.                 case 'F':
  102.                 case 'f':
  103.                     FileName = &String[3];
  104.                     printf("\nSending output to file %s\n", FileName );
  105.                     break;
  106.  
  107.                 default:
  108.                     printf("\nUsage:\n\n\
  109. ProxyLog [/P:portnum] [/F:filename]\n\n\
  110. portnum   must be between 1024 and 32,000 and designates the TCP/IP port\n\
  111.           where the application will listen for a connection.  If no port\n\
  112.           is specified, then port %d will be used.\n\
  113. \n\
  114. filename  optionally specifies a filename that will be used for logging.\n\
  115.           All logged data is saved to this file.\n\
  116. \n\
  117. ", Port );
  118.                     return;
  119.                 }
  120.             }
  121.  
  122.             argc--;
  123.             argv++;
  124.         }
  125.     }
  126.  
  127.     if( FileName )
  128.     {
  129.         FileHandle = open( FileName, _O_APPEND|_O_CREAT|_O_WRONLY, _S_IREAD|_S_IWRITE );
  130.  
  131.         if( FileHandle == (-1) )
  132.         {
  133.             printf("\nUnable to open file %d for writing\n", FileName );
  134.             GetKey();
  135.             return;
  136.         }
  137.     }
  138.  
  139.     if( WSAStartup( 0x0101, &SocketData ) )
  140.     {
  141.         printf("Unable to start up Winsock!!\n\n" );
  142.         GetKey();
  143.         return;
  144.     }
  145.  
  146.     if( SocketData.wVersion < 0x0101 )
  147.     {
  148.         printf("Old version of Winsock present!\nVersion 1.1 is required!\n" );
  149.         GetKey();
  150.         goto AllDone;
  151.     }
  152.  
  153. ListenAgain:
  154.  
  155.     MySock = socket( PF_INET, SOCK_STREAM, 0 );
  156.     if( MySock == INVALID_SOCKET )
  157.     {
  158.         printf("Unable to create socket\n\n");
  159.         GetKey();
  160.         goto AllDone;
  161.     }
  162.  
  163.     {
  164.     SOCKADDR_IN sin;
  165.         sin.sin_family = AF_INET;
  166.         sin.sin_port = htons( (u_short)Port );
  167.         sin.sin_addr.s_addr = 0;  // Don't bind a any card in particular!
  168.  
  169.            if( bind( MySock, (LPSOCKADDR)&sin, sizeof( sin ) ) )
  170.            {
  171.                printf("Unable to bind socket to port %d\n\n", Port );
  172.             GetKey();
  173.                goto AllDone;
  174.            }
  175.     }
  176.  
  177.         // now the sokcet is ready and bound... listen for connection!
  178.     if( listen( MySock, 5 ) )
  179.     {
  180.         printf("WINSOCK error!  Unable to listen for connection on socket.\n\n" );
  181.         GetKey();
  182.         goto AllDone;
  183.     }
  184.  
  185.     printf("Waiting for a connection\nPress 'X' to abort\n\n" );
  186.  
  187.         // now just wait for a connection!
  188.     {
  189.     struct sockaddr Address;
  190.     int AddrLen;
  191.     struct timeval timeout;
  192.  
  193.         printf(" " );
  194.         while( 1 )
  195.         {
  196.         static char Spin[]="-/|\\";
  197.         static int CurChar=0;
  198.         static int Count=0;
  199.         int Ready;
  200.  
  201.                FD_ZERO( &Set );
  202.                FD_SET( MySock, &Set );
  203.                timeout.tv_sec = 0;
  204.                timeout.tv_usec = 0;
  205.    
  206.                Ready = select( 0, &Set, NULL, NULL, &timeout );
  207.    
  208.                if( Ready )
  209.                {
  210.                 AddrLen = sizeof( Address );
  211.                    NewSock = accept( MySock, &Address, &AddrLen );
  212.                    break;
  213.                }
  214.  
  215.             Count++;
  216.  
  217.             if( Count >= 1000 )
  218.             {
  219.                 Count = 0;
  220.                 printf("\b%c", Spin[CurChar++] );
  221.  
  222.                 if( Spin[CurChar] == '\0' )
  223.                     CurChar = 0;
  224.             }
  225.  
  226.             if( !Wait() )
  227.                 goto AllDone;
  228.         }
  229.  
  230.         if( NewSock == INVALID_SOCKET )
  231.         {
  232.             printf("Failed to connect to proxy server\n\n" );
  233.             goto AllDone;
  234.         }
  235.  
  236.         printf("Connected!!\n" );
  237.  
  238.             // Don't need this guy any more!
  239.         closesocket( MySock );
  240.         MySock = INVALID_SOCKET;
  241.     }
  242.  
  243.         // OK! now we are connected and ready to go!
  244.         // Just read the input from the socket and put it on
  245.         // the screen!
  246.     while( Wait() )
  247.     {
  248.     static struct fd_set ReadSet;
  249.     struct timeval timeout;
  250.     int HaveData;
  251.  
  252.         FD_ZERO( &Set );
  253.         FD_SET( NewSock, &Set );
  254.         timeout.tv_sec = 0;
  255.         timeout.tv_usec = 0;
  256.         
  257.         HaveData = select( 0, &Set, NULL, NULL, &timeout );
  258.  
  259.         if( HaveData == SOCKET_ERROR )    // If select had an error... get out of here...
  260.             break;
  261.         else
  262.         if( HaveData )
  263.         {
  264.         static char Buffer[4096];
  265.         int NumRecieved, i;
  266.  
  267.             NumRecieved = recv( NewSock, Buffer, sizeof( Buffer ), 0 );
  268.  
  269.             if( NumRecieved == SOCKET_ERROR
  270.                 || NumRecieved == 0
  271.                 )
  272.             {
  273.                 printf("Socket error recieving.  WinProxy may have closed the socket\n");
  274.                 closesocket( NewSock );
  275.                 NewSock = INVALID_SOCKET;
  276.                 break;
  277.             }
  278.             else
  279.             for( i = 0; i < NumRecieved; i++ )
  280.                 putchar( Buffer[i] );
  281.  
  282.             if( NumRecieved && FileHandle != (-1) )
  283.             {
  284.                 write( FileHandle, Buffer, NumRecieved );
  285.                 write( FileHandle, Buffer, 0 );    // flush the buffers.
  286.             }
  287.         }
  288.     }
  289.  
  290.     if( NewSock != INVALID_SOCKET )
  291.     {
  292.         closesocket( NewSock );
  293.         NewSock = INVALID_SOCKET;
  294.     }
  295.  
  296.     printf("Logging application completed successfully\n\
  297. Waiting for another connection.\n" );
  298.  
  299.     goto ListenAgain;    // yeah... can you believe it! oh, well... the whiles get nested
  300.                         // too deep otherwise... and I can't break out very well.  It is
  301.                         // just a sample.
  302.  
  303. AllDone:
  304.     if( MySock != INVALID_SOCKET )
  305.         closesocket( MySock );
  306.  
  307.     WSACleanup();
  308.  
  309.     if( FileHandle != (-1) )
  310.         close( FileHandle );
  311. }